今天要進一步讓專案可以「真的」操作資料庫。
我們會學到兩個重要工具之一:Prisma 或 TypeORM。
這兩個都是 ORM(Object Relational Mapping),
能讓我們用 TypeScript 操作資料庫,像操作物件一樣簡單。
傳統我們會這樣寫 SQL:
SELECT * FROM todos WHERE done = false;
但在 ORM 裡,我們可以這樣寫:
const todos = await prisma.todo.findMany({
where: { done: false }
});
ORM 會自動幫我們產生 SQL,送到資料庫執行。
對 TypeScript 專案來說,它還能提供 型別提示 ✨
兩者都能用,但我這階段選 Prisma,原因是:
在專案裡執行:
npm install prisma --save-dev
npx prisma init --datasource-provider sqlite
這會建立:
prisma/
└── schema.prisma
以及 .env
:
DATABASE_URL="file:./dev.db"
我們先用 SQLite 當本地練習資料庫,不用額外安裝。
打開 prisma/schema.prisma
,修改成這樣:
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Todo {
id Int @id @default(autoincrement())
task String
done Boolean @default(false)
note String?
createdAt DateTime @default(now())
}
這就等於定義了一個 todos
表格。
npx prisma migrate dev --name init
這行會:
接著:
npx prisma generate
在 src/index.ts
:
import express from "express";
import { PrismaClient } from "@prisma/client";
const app = express();
const prisma = new PrismaClient();
app.use(express.json());
app.get("/todos", async (req, res) => {
const todos = await prisma.todo.findMany();
res.json(todos);
});
app.post("/todos", async (req, res) => {
const { task, note } = req.body;
const todo = await prisma.todo.create({
data: { task, note }
});
res.status(201).json(todo);
});
app.put("/todos/:id", async (req, res) => {
const id = Number(req.params.id);
const { task, done, note } = req.body;
const todo = await prisma.todo.update({
where: { id },
data: { task, done, note }
});
res.json(todo);
});
app.delete("/todos/:id", async (req, res) => {
const id = Number(req.params.id);
await prisma.todo.delete({ where: { id } });
res.json({ message: "Todo 已刪除" });
});
app.listen(3000, () => console.log("🚀 Prisma API running on http://localhost:3000"));
新增 Todo:
curl -X POST http://localhost:3000/todos \
-H "Content-Type: application/json" \
-d '{"task":"Day 24 Prisma 練習","note":"學習 ORM"}'
查詢所有 Todo:
curl http://localhost:3000/todos
Prisma 有一個很好用的 GUI 工具:
npx prisma studio
打開後會出現漂亮的管理介面:http://localhost:5555
可以直接新增、修改、刪除資料,就像輕量版的資料庫後台。
今天是我第一次用 ORM 操作資料庫,感覺真的像魔法一樣 ✨
以前的 API 寫起來很「原始」,今天開始我真的在寫「有資料庫的後端」。